如何快速使用BERT?
前言
BERT 模型
BERT-Large, Uncased (Whole Word Masking)
语言种类:英文
网络结构:24-layer, 1024-hidden, 16-heads
参数规模:340M
BERT-Large, Cased (Whole Word Masking)
语言种类:英文
网络结构:24-layer, 1024-hidden, 16-heads
参数规模:340M
BERT-Base, Uncased
语言种类:英文
网络结构:12-layer, 768-hidden, 12-heads
参数规模:110M
BERT-Large, Uncased
语言种类:英文
网络结构:24-layer, 1024-hidden, 16-heads
参数规模:340M
BERT-Base, Cased
语言种类:英文
网络结构:12-layer, 768-hidden, 12-heads
参数规模:110M
BERT-Large, Cased
语言种类:英文
网络结构:24-layer, 1024-hidden, 16-heads
参数规模:340M
BERT-Base, Multilingual Cased (New, recommended)
语言种类:104 种语言
网络结构:12-layer, 768-hidden, 12-heads
参数规模:110M
BERT-Base, Multilingual Uncased (Orig, not recommended)
语言种类:102 种语言、
网络结构:12-layer, 768-hidden, 12-heads
参数规模:110M
BERT-Base, Chinese
语言种类:中文
网络结构:12-layer, 768-hidden, 12-heads
参数规模:110M
BERT模型具体的网络结构和原理可阅读论文 BERT ,在此不再赘述。
BERT 模型的使用
一、当作文本特征提取的工具,类似Word2vec模型一样
二、作为一个可训练的层,后面可接入客制化的网络,做迁移学习
特征提取工具
首先,需要安装 server 和 client 两个包:
pip install bert-serving-server # 服务端
pip install bert-serving-client # 客户端
然后,下载 BERT 预训练模型,可以点击上述链接下载,比如我们下载中文版本 BERT 模型BERT-Base, Chinese 。下载完成后,解压到本地某个目录下。
例如:/tmp/chinese_L-12_H-768_A-12/
然后,打开终端,输入以下命令启动服务:
bert-serving-start -model_dir /tmp/chinese_L-12_H-768_A-12/ -num_worker=2
from bert_serving.client import BertClient
bc = BertClient()
bc.encode(['龙猫小组真棒', '关注有惊喜', '哈哈'])
bc.encode(['龙猫小组真棒 ||| 关注有惊喜'])
Tensorflow 加载 BERT 模型
利用 bert 开源代码
利用 Tensorflow_hub(推荐)
import tensorflow as tf
from bert import modeling
tf.compat.v1.disable_eager_execution()
def convert_ckpt_to_saved_model(bert_config, init_checkpoint):
# BERT配置文件
bert_config = modeling.BertConfig.from_json_file(bert_config)
# 创建BERT的输入
input_ids = tf.compat.v1.placeholder(shape=(None, None), dtype=tf.int32, name='input_ids')
input_mask = tf.compat.v1.placeholder(shape=(None, None), dtype=tf.int32, name='input_mask')
segment_ids = tf.compat.v1.placeholder(shape=(None, None), dtype=tf.int32, name='segment_ids')
# 创建BERT模型
model = modeling.BertModel(
config=bert_config,
is_training=True,
input_ids=input_ids,
input_mask=input_mask,
token_type_ids=segment_ids,
use_one_hot_embeddings=False, # 使用TPU时,设置为True,速度会快;使用CPU/GPU时,设置为False,速度会快。
)
# 获取模型中所有的训练参数
tvars = tf.compat.v1.trainable_variables()
# 加载BERT模型
(assigment_map, initialized_variable_names) = modeling.get_assignment_map_from_checkpoint(tvars=tvars, init_checkpoint=init_checkpoint)
tf.compat.v1.train.init_from_checkpoint(init_checkpoint, assigment_map)
# 打印加载模型的参数
tf.compat.v1.logging.info(" **** Trainable Variables ****")
for var in tvars:
init_string = ""
if var.name in initialized_variable_names:
init_string = ", *INIT_FROM_CKPT*"
tf.compat.v1.logging.info(" name = {}, shape = {}{}".format(var.name, var.shape, init_string))
with tf.compat.v1.Session() as sess:
sess.run(tf.compat.v1.global_variables_initializer())
builder = tf.compat.v1.saved_model.builder.SavedModelBuilder(saved_model_path)
model_signature = tf.compat.v1.saved_model.signature_def_utils.build_signature_def(
inputs={
"input_ids": tf.compat.v1.saved_model.utils.build_tensor_info(input_ids),
"input_mask": tf.compat.v1.saved_model.utils.build_tensor_info(input_mask),
"segment_ids": tf.compat.v1.saved_model.utils.build_tensor_info(segment_ids)},
outputs={
"pooled_output": tf.compat.v1.saved_model.utils.build_tensor_info(model.pooled_output),
"sequence_output": tf.compat.v1.saved_model.utils.build_tensor_info(model.sequence_output)},
method_name=tf.compat.v1.saved_model.signature_constants.PREDICT_METHOD_NAME)
builder.add_meta_graph_and_variables(
sess,
[tf.saved_model.TRAINING, tf.saved_model.SERVING],
strip_default_attrs=False,
signature_def_map={
tf.compat.v1.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
model_signature})
builder.save()
需要,需要安装 Tensorflow_hub,
pip install tensorflow_hub
下载完成后,解压至本地,就可以利用如下方法加载模型:
import tensorflow_hub as hub
bert_layer = hub.KerasLayer(BERT_PATH, trainable=True, name='bert_layer')
BERT_URL = "https://tfhub.dev/tensorflow/bert_zh_L-12_H-768_A-12/1"
bert_layer = hub.KerasLayer(BERT_URL, trainable=True, name='bert_layer')
Keras 加载 BERT 模型
pip install keras-bert
def BertLayer(bert_path, trainable=True, training=False, seq_len=None, name='bert_layer'):
bert_config_path = os.path.join(bert_path, 'bert_config.json')
bert_checkpoint_path = os.path.join(bert_path, 'bert_model.ckpt')
bert_layer = load_trained_model_from_checkpoint(
bert_config_path, bert_checkpoint_path, training=training, seq_len=seq_len)
bert_layer.name = name
for layer in bert_layer.layers:
layer.trainable = trainable
return bert_layer
后记
—完—
为您推荐